# 七、字典dict

# 7.1 为什么使用字典
"""
生活中的字典是通过字找到对应的含义，而Python中的字典是通过key找到对应的value
"""

# 7.2 字典的定义
"""
字典的定义和集合set一样，都是使用{}，不过存储的元素是键值对，语法如下:
变量 = {key:value, key:value, key:value, ...}
# 键key和值value之间使用冒号分隔

定义空字典
变量 = {}
变量 = dict() 
"""
my_dict1 = {"hello":"你好", "world":"世界","sun":"太阳","laker":"湖人"}
print(f"my_dict1:{my_dict1}, 其类型为: {type(my_dict1)}")

my_dict2 = {} # 空字典
print(f"my_dict2:{my_dict2}, 其类型为: {type(my_dict2)}")

my_dict3 = dict() # 空字典
print(f"my_dict3:{my_dict3}, 其类型为: {type(my_dict3)}")

# 定义重复key的字典
my_dict1 = {"hello":"你好", "world":"世界","general":"基因的", "general":"遗传的"}
print(f"my_dict1:{my_dict1}, 其类型为: {type(my_dict1)}")
# 字典不允许键key重复。如果定义了重复的key，那么新的会将老的覆盖掉

# 7.3 字典数据的获取
# 字典和集合一样，不可以使用下标索引
# 但是字典可以通过key值来取得对应的value
my_dict1 = {"hello":"你好", "world":"世界","sun":"太阳","laker":"湖人"}
print(f"'hello'对应的值是:{my_dict1['hello']}")
print(f"'world'对应的值是:{my_dict1['world']}")
print(f"'sun'对应的值是:{my_dict1['sun']}")
print(f"'laker'对应的值是:{my_dict1['laker']}")

# 7.4 字典的嵌套
"""
字典的key和value也可以是任意类型，但是key不可以为字典类型
"""
# 记录如下学生各科的考试信息
"""
姓名     语文    数学   英语
王力宏    77     66     33
周杰伦    88     86     55
林俊杰    99     96     66
"""
my_dict5 = {"王力宏":{"语文":77,"数学":66,"英语":33}
            ,"周杰伦":{"语文":88,"数学":86,"英语":55}
            ,"林俊杰":{"语文":99,"数学":96,"英语":66}
            }

print(f"王力宏各科成绩为:{my_dict5['王力宏']}")
# 从嵌套字典中获取数据
print(f"林俊杰的数学成绩为:{my_dict5['林俊杰']['数学']}")

# 7.5 字典的常用操作
"""
方法1: 新增元素/更新元素
语法: 对象[Key] = value
注意: 如果Key值在字典中不存在，就是新增元素 
     如果Key值在字典中存在，就是更新Value值
"""
my_dict1 = {"hello":"你好", "world":"世界","sun":"太阳","laker":"湖人"}
my_dict1["generation"] = "一代人, 产生"
print(my_dict1)

"""
方法2: 删除元素
语法: 对象.pop(Key)
注意: pop方法会返回删除Key的Value值，然后把元素删除
"""
my_dict1 = {"hello":"你好", "world":"世界","sun":"太阳","laker":"湖人"}
element_pop = my_dict1.pop("laker")
print(f"删除后:{my_dict1}, 删除的Value值是: {element_pop}")

"""
方法3: 清空元素
语法: 对象.clear()
"""
my_dict1 = {"hello":"你好", "world":"世界","sun":"太阳","laker":"湖人"}
my_dict1.clear()
print(my_dict1)

"""
方法4: 获取字典中全部的Key
语法: 对象.keys()
"""
my_dict1 = {"hello":"你好", "world":"世界","sun":"太阳","laker":"湖人"}
keys = my_dict1.keys()
print(keys)

# 这个方法只要是拿来遍历字典的
my_dict1 = {"hello":"你好", "world":"世界","sun":"太阳","laker":"湖人"}
keys = my_dict1.keys()
for key in keys:
    print(f"{key}的意思是{my_dict1[key]}")

# 还有另一种方法能获取字典对象中的所有Key，那就是for循环
my_dict1 = {"hello":"你好", "world":"世界","sun":"太阳","laker":"湖人"}
for element in my_dict1:
    print(element)

"""
方法5: 获取字典对象的元素数量
语法: len(对象)
"""
my_dict1 = {"hello":"你好", "world":"世界","sun":"太阳","laker":"湖人"}
length = len(my_dict1)
print(f"字典{my_dict1}的元素个数是:{length}")

# 7.6 字典的特征
"""
1. 字典不允许键key重复。如果定义了重复的key，那么新的会将老的覆盖掉
2. 字典的key和value也可以是任意类型，但是key不可以为字典类型
3. 字典和集合一样，不可以使用下标索引
4. 支持for循环，不支持while循环
5. 可以修改
"""

# 7.7 练习案例: 升职加薪
"""
有如下员工信息，请使用字典完成数据的记录，并通过for循环对所有级别为1级的员工的级别上升1级，薪水增加1000元
姓名    部门    工资     级别
王力宏  科技部   3000     1
周杰伦  市场部   5000     2
林俊杰  市场部   7000     3
张学友  科技部   4000     1
刘德华  市场部   6000     2
"""
staff = {"王力宏":{"部门":"科技部","工资":3000,"级别":1},
        "周杰伦":{"部门":"市场部","工资":5000,"级别":2},
         "林俊杰": {"部门": "市场部", "工资": 7000, "级别": 3},
         "张学友": {"部门": "科技部", "工资": 4000, "级别": 1},
         "刘德华": {"部门": "市场部", "工资": 6000, "级别": 2},
         }
print("全体员工当前信息如下:")
print(staff)

print("对所有级别为1级的员工的级别上升1级，薪水增加1000元后:")
for key in staff:
    if staff[key]["级别"] == 1:
        staff[key]["级别"] = 2
        staff[key]["工资"] += 1000
print(staff)
